package Vivienda;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;
import java.security.Signature;

public class Trabajo extends Thread 
{
	private Socket socketCliente;
	
	public void establecerCliente(Socket socket)
	{
		this.socketCliente = socket;
		
		this.setDaemon(true);
	}
	
	public void run() 
	{
		try 
		{
			String horaActual = padLeft("" + System.currentTimeMillis(), 20);
			
			BufferedReader lectorCliente = new BufferedReader(new InputStreamReader(this.socketCliente.getInputStream()));
			String mensaje = lectorCliente.readLine();
			
			lectorCliente.close();
			
			String codigoSensor = mensaje.substring(0, 4);
			boolean alarmar = mensaje.substring(4).contains("1");
			
			if(Principal.sensores.containsKey(codigoSensor))
			{
				Sensor sensor = Principal.sensores.get(codigoSensor);
				
				if(alarmar && sensor.encendido)
				{
					String mensajeAEnviar = String.format("%s%s%s10NADA_POR_AQUI", horaActual, sensor.casa, sensor.tipo);
					
					byte[] firmaDigital = this.firmarDigitalmenteMensaje(mensajeAEnviar);
					byte[] mensajeEnBytes = this.convertirCadenaABytes(mensajeAEnviar);
					byte tamanoFirmaDigital = (byte)firmaDigital.length;
					
					byte[] mensajeTotal = new byte[firmaDigital.length + mensajeEnBytes.length + 1];
					mensajeTotal[0] = tamanoFirmaDigital; 
					int i = 1;
					for(byte b: firmaDigital)
					{
						mensajeTotal[i] = b;
						i++;
					}
					for(byte b: mensajeEnBytes)
					{
						mensajeTotal[i] = b;
						i++;
					}
					
					try
					{
						System.out.println("Intentando enviar a servidor principal");
						
						Socket servidorUrbanizacion = new Socket(Principal.IP_SERVIDOR_MONITOR_PPAL, Principal.PUERTO_SERVIDOR_MONITOR_PPAL);
						servidorUrbanizacion.getOutputStream().write(mensajeTotal); 
						servidorUrbanizacion.getOutputStream().close();
						servidorUrbanizacion.close();
						
						System.out.println("Se envio exitosamente a servidor principal");
					}
					catch(Exception ex)
					{
						try
						{
							System.out.println("Intentando enviar a servidor secundario");
							
							Socket servidorUrbanizacion = new Socket(Principal.IP_SERVIDOR_MONITOR_BKP, Principal.PUERTO_SERVIDOR_MONITOR_BKP);
							servidorUrbanizacion.getOutputStream().write(mensajeTotal); 
							servidorUrbanizacion.getOutputStream().close();
							servidorUrbanizacion.close();
							
							System.out.println("Se envio exitosamente a servidor secundario");
							
							synchronized(this)
							{
								String sTmp = "" + Principal.IP_SERVIDOR_MONITOR_PPAL;
								int nTmp = Principal.PUERTO_SERVIDOR_MONITOR_PPAL;
								
								Principal.IP_SERVIDOR_MONITOR_PPAL = "" + Principal.IP_SERVIDOR_MONITOR_BKP; 
								Principal.PUERTO_SERVIDOR_MONITOR_PPAL = Principal.PUERTO_SERVIDOR_MONITOR_BKP;
								
								Principal.IP_SERVIDOR_MONITOR_BKP = "" + sTmp;
								Principal.PUERTO_SERVIDOR_MONITOR_BKP = nTmp;
								
								System.out.println("Se han switcheado los servidores");
							}
						}
						catch(Exception ex1)
						{
							// aqui si paila, se cayeron los dos monitores
							ex1.printStackTrace();
						}
					}
				}
				else
				{
					//TODO: Preguntarle a Oscar que hacer aqui
				}
			}
			
			this.socketCliente.close();
		} 
		catch (Exception e2) 
		{
			e2.printStackTrace();
		}
	}

	public static String padLeft(String s, int n) {
	    return String.format("%1$#" + n + "s", s).replace(' ', '0');  
	}
	
	private byte[] firmarDigitalmenteMensaje(String mensajeAFirmar)
	{
		byte[] firmaDigital = null;
		
		try
		{
			Signature dsa = Signature.getInstance("SHA1withDSA", "SUN"); 
	        dsa.initSign(Principal.PRIVATE_KEY_CASA);
	        
	        char[] caracteresMensaje = mensajeAFirmar.toCharArray();
	        byte[] bytesMensaje = new byte[caracteresMensaje.length];
	        int i = 0;
	        for(char c: caracteresMensaje)
	        {
	        	bytesMensaje[i] = (byte)c;
	        	i++;
	        }	
	        dsa.update(bytesMensaje);
	
	        // Se genera la firma para este mensaje a enviar
	        firmaDigital = dsa.sign();
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
		
		return firmaDigital;
	}
	
	private byte[] convertirCadenaABytes(String cadena)
	{
		byte[] resultado = null;
		
		char[] caracteres = cadena.toCharArray();
        resultado = new byte[caracteres.length];
        int i = 0;
        for(char c: caracteres)
        {
        	resultado[i] = (byte)c;
        	i++;
        }	
		
		return resultado;
	}

}
